import axios from 'axios'
import store from '../store'
import router from 'routerPath/index'
import qs from 'qs'
import i18n from '../i18n/i18n';
import {
  HTTP_METHOD,
  URL_DEFAULT_PREFIXER,
  REQ_TIME_OUT,
  CONTENT_TYPE,
  TOKEN_TIME_EXPIRE
} from './config'
import {
  Message
} from 'element-ui'

axios.defaults.baseURL = URL_DEFAULT_PREFIXER
axios.defaults.timeout = REQ_TIME_OUT

/**
 * 请求接口封装
 * @param {*} path  路径
 * @param {*} method 请求路径
 * @param {*} isSerializerParams 是否序列化
 * @param {*} params 请求参数
 */
export async function reqHandle(
  path = '', {
    method = HTTP_METHOD.GET,
    isSerializerParams = true,
    params = {}
  }
) {
  axios.defaults.headers['Content-Type'] = isSerializerParams ? CONTENT_TYPE.FORM : CONTENT_TYPE.JSON
  if (sessionStorage.getItem('vrToken')) {
    axios.defaults.headers.common['Authorization'] = 'Bearer ' + sessionStorage.getItem('vrToken') || ''
  }
  let data = {}
  if (isSerializerParams) {
    data = qs.stringify(params)
  } else {
    if (method === 'get' || method === 'delete') {
      data = {
        params
      }
    } else {
      data = params
    }
  }
  return new Promise((resolve, reject) => {
    axios[method](path, data).then(res => {
      resolve(res.data)
    }).catch(err => {
      reject(err.data)
    })
  })
}

/**
 * 拦截请求
 */
axios.interceptors.request.use(config => {
  return config
}, error => {
  return Promise.errr(error)
})

/**
 * 拦截响应
 */
axios.interceptors.response.use(res => {
  // code：200 成功
  if (res.status === 200) {
    if (res.data.code === 0) {
      return Promise.resolve(res)
    } else if (res.data.code === 1) {
      // 判断错误码
      switch (res.data.errorCode) {
        case 100:
          Message.error(i18n.t('errCode.err100'))
          break
        case 101:
          Message.error(i18n.t('errCode.err101'))
          break
        case 102:
          Message.error(i18n.t('errCode.err102'))
          break
        case 103:
          Message.error(i18n.t('errCode.err103'))
          break
        case 104:
          Message.error(i18n.t('errCode.err104'))
          break
        case 105:
          Message.error(i18n.t('errCode.err105'))
          break
        case 106:
          Message.error(i18n.t('errCode.err106'))
          break
        case 110:
          Message.error(i18n.t('errCode.err110'))
          break
        case 111:
          Message.error(i18n.t('errCode.err111'))
          break
        case 112:
          Message.error(i18n.t('errCode.err112'))
          break
        case 113:
          Message.error(i18n.t('errCode.err113'))
          break
        case 200:
          Message.error(i18n.t('errCode.err200'))
          break
        case 201:
          Message.error(i18n.t('errCode.err201'))
          break
        case 300:
          Message.error(i18n.t('errCode.err300'))
          break
        case 301:
          Message.error(i18n.t('errCode.err301'))
          break
        case 400:
          Message.error(i18n.t('errCode.err400'))
          break
        case 401:
          Message.error(i18n.t('errCode.err401'))
          break
        default:
          Message.error(i18n.t('errCode.err9999'))
      }
      return Promise.reject(res)
    }
  }
}, error => {
  if (error.response.status) {
    Message.closeAll()
    switch (error.response.status) {
      case 403: // 权限不足
        Message.error('权限不足')
        break
      case 401: // 未登录或过期
        // Message.error('未登录')
        store.commit('isShowLogin', 'show')
        break
      case 404: // 请求不存在
        Message.error('请求不存在')
        break
      case 405: // 请求方式错误
        Message.error('请求方式错误')
        break
      default:
        Message.error(i18n.t('errCode.err9999'))
    }
  }
})